/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package loja.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import loja.dao.exceptions.BuscaException;
import loja.dao.exceptions.ImpossivelAtualizarException;
import loja.dao.exceptions.ImpossivelCriarException;
import loja.dao.exceptions.ImpossivelDeletarException;
import loja.dominio.Categoria;

/**
 *
 * @author Rodrigo
 */
public class CategoriaDao extends AbstractGenericDao<Categoria> {

    @Override
    public void criar(Categoria categoria) throws ImpossivelCriarException {
        String sql = "insert into categoria(categoria) values (?)";
        PreparedStatement stmt = null;

        try {
            iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setString(1, categoria.getCategoria());
            stmt.execute();
            comitarTransacao();
            JOptionPane.showMessageDialog(null, "Registro salvo com SUCESSO!!!");
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelCriarException("Não foi possível criar um nova categoria.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public void atualizar(Categoria categoria) throws ImpossivelAtualizarException {
        String sql = "update categoria set categoria=? where idcategoria=?";
        PreparedStatement stmt = null;

        try {
            iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setString(1, categoria.getCategoria());
            stmt.setLong(2, categoria.getId());
            stmt.execute();
            comitarTransacao();
            JOptionPane.showMessageDialog(null, "Registro Alterado com SUCESSO!!!");
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelAtualizarException("Não foi possível atualizar a  categoria.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public void deletar(Categoria categoria) throws ImpossivelDeletarException {
        String sql = "delete from categoria where idcategoria=?";
        PreparedStatement stmt = null;

        try {
            iniciarTransacao();
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, categoria.getId());
            stmt.execute();
            comitarTransacao();
            JOptionPane.showMessageDialog(null, "Registro excluido com SUCESSO!!!");
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelDeletarException("Não foi possível Excluir a categoria.");
        } finally {
            closeStatement(stmt);
        }
    }

    @Override
    public Categoria buscar(Long id) throws BuscaException {
        String sql = "select * from categoria where idcategoria=?";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Categoria categoria = null;

        try {
            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, id);
            rs = stmt.executeQuery();
            if (rs.next()) {
                categoria = construirCategoria(rs);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar a Categoria.");
        }
        return categoria;
    }

    @Override
    public List<Categoria> buscarTodos() throws BuscaException {
        String sql = "select * from categoria";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Categoria> categorias = null;
        Categoria categoria = null;
        try {
            stmt = getConexao().prepareStatement(sql);
            rs = stmt.executeQuery();
            categorias = new ArrayList<Categoria>();
            while (rs.next()) {
                categoria = construirCategoria(rs);
                categorias.add(categoria);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar as Categorias.");
        }
        return categorias;
    }

    public List<Categoria> buscarPorDescricao(String descricao) throws BuscaException {
        String sql = "select * from categoria where categoria like ?";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Categoria> categorias = null;
        Categoria categoria = null;
        try {
            stmt = getConexao().prepareStatement(sql);
            stmt.setString(1, "%" + descricao + "%");
            rs = stmt.executeQuery();

            categorias = new ArrayList<Categoria>();

            while (rs.next()) {
                categoria = construirCategoria(rs);
                categorias.add(categoria);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar as Categoria.");
        }
        return categorias;
    }

    @Override
    public long contar() throws BuscaException {
        String sql = "select count(*) from categoria";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Long total = null;

        try {

            stmt = getConexao().prepareStatement(sql);

            rs = stmt.executeQuery();

            while (rs.next()) {
                total = rs.getLong(1);
            }

        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível contar Categoria.");

        }
        return total;
    }

    private Categoria construirCategoria(ResultSet rs) throws SQLException {
        Categoria categoria = new Categoria();
        categoria.setId(rs.getLong("idcategoria"));
        categoria.setCategoria(rs.getString("categoria"));
        return categoria;
    }
}
